Fork me on GitHub

Spring设计框架与设计模式

注意:所有文章除特别说明外,转载请注明出处.

第13章 Spring框架的设计理念与设计模式分析

[TOC]

13.1 Spring的骨骼架构

Spring的核心组件只有三种:Core | Context | Bean。其构建起整个Spring骨骼架构,没有它们就不可能有AOP | Web等上层的特性功能。

13.1.1 Spring的设计理念

Spring解决非常关键的问题,它可以让我们将对象之间的依赖关系转而用配置文件来管理,也就是依赖注入机制。而这个注入关系由Ioc容器中管理。

我们知道Bean包装的是Object,而Object必然有数据,而Context要解决的是数据的生存问题,发现每个Bean之间的关系。所以Context是一个Bean关系的集合,这个关系集合又叫Ioc容器。Core就是发现、建立和维护每个Bean之间的关系所需要的一些列工具。

13.2 核心组件

13.2.1 Bean组件

Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory。BeanFactory有三个子类:1. ListableFactory 2. HierarchicalBeanFactory 3. AutowireCapacleBeanFactory。但最终的默认实现类都是 DefaultListableBeanFactory。

定义这么多接口的原因是因为每个接口都有其使用的场合,其主要区分在Spring对象内部对象的转换和传递过程,将对象的数据访问做限制。

1. ListableBeanFactory 表示Bean是可列表的

2. HierarchicalBeanFactory 表示这些Bean是有继承关系的

3. Autowire.. 表示Bean的自动装配规则

Bean的定义主要有BeanDefinition描述。Bean的完整描述了在Spring配置文件中定义节点中所有的信息,包括各种子节点。

提示:Bean的解析过程就是对Spring配置文件的解析。

13.2.2 Context组件

Context在Spring的 org.springframework.context 包下面。ApplicationContext是Context的顶级父类,它除了标识一个应用环境的基本信息之外,还继承了5个接口。

ApplicationContext继承了BeanFactory,说明了Spring容器中运行的主体对象是Bean。另外ApplicationContext继承了ResourceFactory接口,可以访问任何外部资源。

ApplicationContext的子类包含两个方面:

1. ConfigurableApplicationContext 表示该Context可修改,在构建Context用户可以动态添加和修改已有的配置信息,其下面有多个子类,最常使用可更新的Context(AbstractRefreshableApplicationContext类)。

2. WebApplicationContext 表示为Web准备的Context,可以直接访问到ServletContext。

总体来说Context必须完成以下几件事情:

1. 标识一个应用环境

2. 利用BeanFactory创建Bean对象

3. 保存对象关系表

4. 能够捕获各种事件

12.2.3 Core组件

Core组件是Spring的核心组件,包含了很多关键类,一个重要的组成部分是定义了资源的访问方式。

12.2.4 Ioc容器工作过程

1. 创建BeanFacoty工厂

    Ioc容器实际上是Context组件结合其它两个组件共同构建了一个Bean关系网。 


4. Ioc容器

    我们如果需要使用Spring必须要先构建Ioc容器,没有它Spring无法工作,ApplicationContext.xml就是Ioc容器默认配置文件,Spring的所有特性功能都是基于Ioc容器工作的。

13.3 Spring中AOP

13.3.1 动态代理

AOP是基于动态代理实现的。在JDK的java.lang.reflect包下有个Proxy类,是构造代理类的入口。最后一个方法newproxyInstance是创建代理对象的方法。

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);

1. ClassLoader 用于加载代理类的Loader类,通常这个Loader类和被代理的类是同一个Loader类。

2. interfaces 被代理的那些接口

3. InvocationHandler 用于执行除了被代理类接口中方法之外的用户定义的操作,是用户需要代理的最终目的。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法invoke()中。

13.3.2 Spring AOP的实现

代理的目的是调用目标方法时可以转而执行InvocationHandler类的invoke()方法,所以如何在InvocationHandler类上做文章便是实现AOP的关键所在。

Spring如何完成代理:

1. 代理类继承了FactoryBean的ProxyFactoryBean,FactoryBeab之所以特别就在于它可以让我们自定义对象的创建方法。

2. Spring在创建代理对象之后,在我们调用目标对象上的方法时,都会被代理到InvocationHandler类的invok()方法中执行。

13.4 设计模式之代理模式

13.4.1 代理模式原理

代理模式就是给某一个对象创建一个代理对象,由这个代理对象控制对原对象的引用,而创建此代理对象后可以在调用原对象时增加一些额外的操作。

1. Subject 抽象主题,它是代理对象的真实对象要实现的接口

2. ProxySubject 代理类,除了实现抽象主题定义的接口外,还必须持有所代理对象的引用

3. RealSubject 被代理的类,是目标对象

13.5 设计模式之策略模式

13.5.1 策略模式原理

表示完成某个操作可能有多种方法,这些方法都可能被使用到,每个实现方法都当做一个实现策略,用户可以根据场景选择合适的策略。

1. Context 不同策略的环境,可根据自身条件选择不同的策略实现类完成所要的操作。

2. Strategy 抽象策略,定义每个策略都要实现的策略方法

3. ConcreteStrategy 具体策略实现类,实现抽象策略中定义的策略方法

13.5.2 Spring中策略模式的实现

Spring中有多个地方用到了策略模式。如:Bean定义对象的创建及代理对象的创建等。

本文标题:Spring设计框架与设计模式

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 07:38:31

原始链接:http://bangjinhu.github.io/undefined/第13章 Spring框架的设计理念与设计模式分析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.